package br.com.gemepde.control;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.com.gemepde.dao.impl.AlunoDaoHibernate;
import br.com.gemepde.dao.impl.ArquivoDaoHibernate;
import br.com.gemepde.dao.impl.ModuloDaoHibernate;
import br.com.gemepde.domain.Aluno;
import br.com.gemepde.domain.Arquivo;
import br.com.gemepde.domain.EstadoCivil;
import br.com.gemepde.domain.GrauInstrucao;
import br.com.gemepde.domain.Modulo;
import br.com.gemepde.domain.filter.AlunoFilter;
import br.com.gemepde.utils.BackupDataBase;

@ManagedBean
@SessionScoped
public class AlunoBean implements Serializable{
	
	private static final long serialVersionUID = -2952273955886369191L;
	
	private static final String URL_BUSCA = "busca.xhtml";
	private static final String URL_CADASTRO = "cadastro.xhtml";
	
	private String tipoBotaoCadastro;
	private Aluno aluno = new Aluno();
	private AlunoFilter alunoFilter = new AlunoFilter();
	private List<Aluno> resultadoDaBusca = new ArrayList<Aluno>();
	private boolean adicionarCabecalho = false;
	private StreamedContent arquivoBackup = null;
	
	//DAO's
	private AlunoDaoHibernate alunoDao = new AlunoDaoHibernate();
	private ModuloDaoHibernate moduloDao = new ModuloDaoHibernate();
	private ArquivoDaoHibernate arquivoDao = new ArquivoDaoHibernate();
	
	public AlunoBean() {
		resetCadastroAluno();
	}
	
	//METODOS **MENU**
	public String novoAluno(){
		resetCadastroAluno();
		return URL_CADASTRO;
	}
	
	public void resetCadastroAluno(){
		aluno = new Aluno();
		setTipoBotaoCadastro("Salvar");
		alunoFilter = new AlunoFilter();
		resultadoDaBusca.clear();
	}
	
	public StreamedContent getArquivoBackup() {
		
		try {
			String arquivo = BackupDataBase.criarBkpBase();
			String nome = arquivo.trim().split("temp\\\\")[1];
			InputStream stream = new FileInputStream(arquivo);
			arquivoBackup = new DefaultStreamedContent(stream, "application/octet-stream", nome);
		} catch (FileNotFoundException e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Arquivo de backup não encontrado ", null));
		}
		
		return arquivoBackup;
	}

	public void setArquivoBackup(StreamedContent arquivoBackup) {
		this.arquivoBackup = arquivoBackup;
	}
	
	public void procurarAluno(){
		resultadoDaBusca = alunoDao.encontrarPorFiltro(alunoFilter);	
//		return URL_BUSCA;
	}
	
	@SuppressWarnings("unchecked")
	public String salvarAluno(){
		
		try {
			
			ServletContext servlet = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
			List<Modulo> modulos = (List<Modulo>) servlet.getAttribute("listaModulos");
			Arquivo avatar = (Arquivo) servlet.getAttribute("arquivoAvatar");
			List<Arquivo> arqObs = (List<Arquivo>) servlet.getAttribute("listaArquivosObservacao");
			List<Arquivo> arqInfo = (List<Arquivo>) servlet.getAttribute("listaArquivosInformacao");
			
			if (aluno.getNome() == null){
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Campo nome obrigatório ", null));
				return "";
			}
			
			
			
			
			
//			alunoDao.salvar(aluno);
//			
//			ModuloBean moduloBean = new ModuloBean();
//			
//			for (Modulo modulo : moduloBean.getListaModulos()) {
//				modulo.setAluno(aluno);
//				new ModuloDaoHibernate().salvar(modulo);
//			}
//			
//			ArquivoBean arquivoBean = new ArquivoBean();
//			Arquivo avatar = arquivoBean.getArquivoAvatar();
//			avatar.setAluno(aluno);
//			new ArquivoDaoHibernate().salvar(avatar);
//			
//			for (Arquivo observacao : arquivoBean.getListaArquivosObservacao()) {
//				observacao.setAluno(aluno);
//				new ArquivoDaoHibernate().salvar(observacao);
//			}
//			
//			for (Arquivo informacao : arquivoBean.getListaArquivosInformacao()) {
//				informacao.setAluno(aluno);
//				new ArquivoDaoHibernate().salvar(informacao);
//			}
//				
//			resultadoDaBusca.add(aluno);
			
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Aluno cadastrado com sucesso.", null));
			
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocorreu um problema no cadastro.", null));
		}
		
		return URL_BUSCA;
	}
	
	//TODO: verificar se o retorno do request ja vem o objeto inteiro, caso venha, não é necessario realizar a busca pelo objeto completo em "encontrarUmAluno"
	public String editarAluno(){
		tipoBotaoCadastro = "Atualizar";
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		Aluno alunoFilter = (Aluno) request.getAttribute("aluno");
		aluno = alunoDao.encontrarUmAluno(alunoFilter.getId());
		return URL_CADASTRO;
	}
	
	//TODO: igualmente para cá
	public void deletarAluno(){
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		Aluno alunoFilter = (Aluno) request.getAttribute("aluno");
		aluno = alunoDao.encontrarUmAluno(alunoFilter.getId());
		alunoDao.excluir(aluno);
		resultadoDaBusca.remove(aluno);
//		return URL_BUSCA;
	}
	
	public void dialogImpressao(){
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		aluno = (Aluno) request.getAttribute("aluno");
	}
	
	public void imprimirAluno(){
		
//		try {
//			FacesContext facesContext = FacesContext.getCurrentInstance();
//			facesContext.responseComplete();
//			ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
//			
//			List<Aluno> impressoes = new ArrayList<Aluno>();
//			impressoes.add(aluno);
//			JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(impressoes);
//			
//			JasperPrint jasperPrint = JasperFillManager.fillReport(scontext.getRealPath("/relatorio/reportaluno.jasper"), null, ds);
//			
//			ByteArrayOutputStream baos = new ByteArrayOutputStream();
//
//			JRPdfExporter exporter = new JRPdfExporter();
//			exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
//			exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
//			exporter.exportReport();
//
//			byte[] bytes = baos.toByteArray();
//
//			if (bytes != null && bytes.length > 0) {
//
//				HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
//				response.setContentType("application/pdf");
//				response.setHeader("Content-disposition", "inline; filename=\"relatorio"+aluno.getId()+".pdf\"");
//				response.setContentLength(bytes.length);
//
//				ServletOutputStream outputStream = response.getOutputStream();
//				outputStream.write(bytes, 0, bytes.length);
//				outputStream.flush();
//				outputStream.close();
//			}
//		} catch (Exception e) {
//			// TODO: handle exception
//			e.printStackTrace();
//		}
		
	}
	
	public List<SelectItem> getListaGrauInstrucao()
	{
		List<SelectItem> selectables = new ArrayList<SelectItem>(); 
		
		for (GrauInstrucao grau : GrauInstrucao.values()){
			selectables.add(new SelectItem(grau.getGrauInstrucao()));
		}
		return selectables;
	}
	
	public List<SelectItem> getListaEstadoCivil()
	{
		List<SelectItem> selectables = new ArrayList<SelectItem>(); 
		for (EstadoCivil civil: EstadoCivil.values()){
			selectables.add(new SelectItem(civil));
		}
		return selectables;
	}
	
	public AlunoFilter getAlunoFilter() {
		return alunoFilter;
	}

	public void setAlunoFilter(AlunoFilter alunoFilter) {
		this.alunoFilter = alunoFilter;
	}

	public List<Aluno> getResultadoDaBusca() {
		return resultadoDaBusca;
	}

	public void setResultadoDaBusca(List<Aluno> resultadoDaBusca) {
		this.resultadoDaBusca = resultadoDaBusca;
	}

	public boolean isAdicionarCabecalho() {
		return adicionarCabecalho;
	}

	public void setAdicionarCabecalho(boolean adicionarCabecalho) {
		this.adicionarCabecalho = adicionarCabecalho;
	}

	public Aluno getAluno() {
		return aluno;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

	public String getTipoBotaoCadastro() {
		return tipoBotaoCadastro;
	}

	public void setTipoBotaoCadastro(String tipoBotaoCadastro) {
		this.tipoBotaoCadastro = tipoBotaoCadastro;
	}

	public AlunoDaoHibernate getAlunoDao() {
		return alunoDao;
	}

	public void setAlunoDao(AlunoDaoHibernate alunoDao) {
		this.alunoDao = alunoDao;
	}

	public ModuloDaoHibernate getModuloDao() {
		return moduloDao;
	}

	public void setModuloDao(ModuloDaoHibernate moduloDao) {
		this.moduloDao = moduloDao;
	}

	public ArquivoDaoHibernate getArquivoDao() {
		return arquivoDao;
	}

	public void setArquivoDao(ArquivoDaoHibernate arquivoDao) {
		this.arquivoDao = arquivoDao;
	}
}
